package org.su.generalmvc.core;

import org.su.generalmvc.IParamBinder;
import org.su.generalmvc.config.XSSHConfig;
import org.su.generalmvc.entity.PojoCache;

import java.util.Map;

/**
 * 系统应用上下文环境，包括actions，拦截器等等
 * @author yangchuan
 *
 */
public interface IXsshApplicationContext {
	
	public String ROOT_APPLICATION_CONTEXT_ATTRIBUTE ="root_application_context_attribute";

	/**
	 * 得到actions
	 * @return 得到action映射列表
	 */
	public abstract Map<String, ActionProxy> getPostActions();

	/**
	 * 得到actions
	 * @return 得到action映射列表
	 */
	public abstract Map<String, ActionProxy> getGetActions();

	/**
	 * 得到actions
	 * @return 得到action映射列表
	 */
	public abstract Map<String, ActionProxy> getAllActions();

	/**
	 * 得到actions
	 * @return 得到action映射列表
	 */
	public abstract Map<String, ActionProxy> getActions();

	/**
	 * 设置action映射列表
	 * @param actions action映射列表
	 */
	public abstract void setActions(Map<String, ActionProxy> actions);

	/**
	 * 设置action映射列表
	 * @param actions action映射列表
	 */
	public abstract void setPostActions(Map<String, ActionProxy> actions);

	/**
	 * 设置action映射列表
	 * @param actions action映射列表
	 */
	public abstract void setGetActions(Map<String, ActionProxy> actions);


	/**
	 * 设置action映射列表
	 * @param actions action映射列表
	 */
	public abstract void setAllActions(Map<String, ActionProxy> actions);

	/**
	 * 得到系统配置
	 * @return 返回xssh.xml文件配置信息
	 */
	public abstract XSSHConfig getConfig();

	/**
	 * 设置系统配置对象
	 * @param config xssh.xml的配置信息
	 */
	public abstract void setConfig(XSSHConfig config);


	/**
	 * 判断是否使用spring环境
	 * @return 判断是否使用spring环境
	 */
	public abstract boolean isSpringContext();

	/**
	 * 初始化应用环境
	// * @param servletContext web应用上下文环境
	 */
	public abstract void init(IServiceContext servletContext);

	/**
	 * 添加包
	 * 
	 * @param packeageName 包 名称
	 * @param xsshPackage 包 对象
	 */
	public abstract void addPackage(String packeageName, XsshPackage xsshPackage);


	/**
	 * 	
	 * 获取包对象
	 * 
	 * @param packeageName 包 名称
	 * @return 返回指定名称的包对象
	 */
	public abstract XsshPackage getPackage(String packeageName);

	/**
	 * 动态添加bean到Spring容器里
	 * 
	 * @param beanName
	 *            bean 名称
	 * @param beanClass
	 *            bean类型
	 */
	public abstract Object addBean(String beanName, Class<?> beanClass);

	/**
	 * 动态添加bean到IXSSHApplicationContext容器里
	 * @param beanName bean名称
	 * @param beanClass beanclass名称
	 * @return 返回指定名称的bean对象
	 */
	public abstract Object addBean(String beanName, String beanClass);

	/**
	 * 从bean中获取bean对象
	 * 
	 * @param beanName bean名称
	 * @return 得到指定名称的bean对象
	 */
	public abstract <T> T getBean(String beanName);
	
	/**
	 * 从IXSSHApplicationContext中删除指定的bean对象
	 * 
	 * @param beanName bean名称
	 */
	public abstract void removeBean(String beanName);

	/**
	 * 关闭IXSSHApplicationContext容器
	 */
	public abstract void destroy();

	/**
	 * 是否使用数据库
	 * @return 如果使用默认的数据库管理器则返回true 否则返回false
	 */
	public boolean isUseDB();
	
	/**
	 * 获取PojoBean 管理容器
	 * @return 返回PojoBean 管理容器
	 */
	public Map<String, PojoCache> getPojoContext();
	
	/**
	 * 获取集群中单机id编号,优先获取tomcat环境变量中的值，其次才从xssh.xml中获取
	 * @return
	 */
	public int getServerId();
	
	/**
	 * 设置集群中单机id编号
	 * @return
	 */
	public void setServerId(int serverId) ;

	/**
	 * 是否包含bean
	 * @param beanName
	 * @return
	 */
	public boolean containsBean(String beanName);

    /**
     * 获取写一层上下文环境
     * @return
     */
    public IServiceContext getServiceContext();

    public IParamBinder getParamBinder();
	
}